package com.tanhua.dubbo.server.api;


import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.dubbo.config.annotation.Service;
import com.tanhua.dubbo.server.enums.IdType;
import com.tanhua.dubbo.server.pojo.Sound;
import com.tanhua.dubbo.server.service.IdService;
import lombok.extern.slf4j.Slf4j;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.List;

@Service(version = "1.0.0")
@Slf4j
public class SoundApiImpl implements SoundApi {

    @Autowired
    private IdService idService;

    @Autowired
    private MongoTemplate mongoTemplate;

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    //向redis中存储sid的key
    private static final String REDIS_KEY = "SOUND_KEY";

    /**
     * 发送语音
     * @param sound
     * @return
     */
    @Override
    public String saveSound(Sound sound) {

        try {
            //如果用户id与语音地址路径为空的话，直接返回null
            if (!ObjectUtil.isAllNotEmpty(sound.getUserId(),sound.getSouUrl())){
                return null;
            }

            //封装实体sound对象
            sound.setId(new ObjectId()); //主键id
            sound.setSid(idService.createId(IdType.SOUND_ID));//sid 自增长的sid
            sound.setCreated(System.currentTimeMillis());  //当前时间

            //将封装好的sound对象 数据存储到mongo中
            this.mongoTemplate.save(sound);


            //向redis中追加sid 已逗号分割  key:SOUND_KEY:1,2,3
            redisTemplate.opsForValue().append(REDIS_KEY,sound.getSid()+",");

//            //添加成功返回发语音人的id（此方法可以没有返回值）
//            return sound.getId().toHexString();
        } catch (Exception e) {
            log.error("上传语音失败");
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 查询redis中存储的所有sid
     * @return 返回所有存储在redis所有中sid的集合
     */
    @Override
    public List<String> querySidList() {

        //根据key获取到所有的sid的一个字符串
        String redisKey = redisTemplate.opsForValue().get(REDIS_KEY);
        if (redisKey==null){
            return null;
        }

        //将字符串按逗号切割为一个存储sid的一个集合
        List<String> stringList = StrUtil.split(redisKey, ',');
        //返回所有的sid
        return stringList;

    }


    /**
     * 根据sid查询语音
     * @param sid
     * @return
     */
    @Override
    public Sound querySound(Long sid) {

        //根据存储在redis中的sid，去mongo中查询sid=sid的语音信息
        Query query = Query.query(Criteria.where("sid").is(sid));
        //返回查询到的结果
        return mongoTemplate.findOne(query,Sound.class);
    }

}
